<template>
  <view class="sv-exam-plus-page">
    <sv-exam-plus
      :type="examOptions && examOptions.opt.type"
      :lib="examOptions && examOptions.param.from_lib"
      :data="examData"
      :favs="myFavs"
      @changePaper="changePaper"
      @quit="onQuit"
    />
  </view>
</template>

<script>
import { shuffleAndPick } from '@/uni_modules/sv-exam-plus/utils/index.js'
import question from "@/api/question";
export default {
  data() {
    return {
      examOptions: null,
      examData: [], // 题目列表
      myFavs: [] // 收藏夹
    }
  },
  computed: {
    pageTitle() {
      return this.examOptions?.opt.lib_name || '试题'
    }
  },
  onLoad() {
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.once('e-transmit-exams', async (res) => {
      this.examOptions = res // 从错题本或试题收藏夹页面传过来试题列表
      this.init() // 初始化操作
      // 异步获取数据 需要async/await 确保数据取到后再执行后续操作
      await this.handleData()
      // todoContinue需要确保在handleData处理完题库数据装载完成后再执行
      this.todoContinue()
      // 开启相关事件监听
      this.examWatcher()
    })
  },
  onUnload() {
    console.log('=== 页面卸载 移除所有监听 ===')
    // 移除事件监听 建议在此处将考试相关所有监听统一移除
    uni.$off('e-exam-paper-item-submit')
    uni.$off('e-exam-paper-complete')
    uni.$off('e-exam-paper-item-fav')
    uni.$off('e-exam-paper-item-feedback')
  },
  methods: {
    init() {
      // 初始化操作
    },
    // 数据处理
    async handleData() {
      const { param, opt, apifunc } = this.examOptions
      // 模拟从接口异步获取题目数据
      const dataRes = await apifunc.examList(param)
      let tempExamData = dataRes.data || []
      // 模拟考试模式需要打乱顺序并取随机100道题目(具体数目可由opt传入)
      if (opt.type == 'exam') {
        tempExamData = shuffleAndPick(dataRes.data, 100)
      }
      this.examData = tempExamData
      this.myFavs = uni.getStorageSync('sv-exam-fav') || []
    },
    // 继续进度刷题
    todoContinue() {
      const { param, opt } = this.examOptions
      if (opt.type !== 'practice') return
      let dataCache = uni.getStorageSync('sv-exam-data-cache')
      if (dataCache[param.from_lib]?.length > 0) {
        uni.showModal({
          title: '系统提示',
          content: '是否继续上次答题？',
          showCancel: true,
          success: ({ confirm }) => {
            if (confirm) {
              this.examData = dataCache[param.from_lib]
            } else {
              // 重新开始答题
              uni.$emit('sv-exam-start', 0)
            }
          }
        })
      }
    },

    /**
     * 切换题目
     * @param {Object} e 当前题目
     */
    changePaper(e) {
      // console.log('==== 切换题目 :', e)
    },

    /**
     * 退出考试
     * @param {Object} e 做题记录，可缓存或上传云端，用作下一次打开后继续进度
     */
    onQuit(e) {
      const { param, opt } = this.examOptions
      // 做出区分，只有练习模式的时候，在退出后可以继续答题
      if (opt.type == 'practice') {
        const storage = uni.getStorageSync('sv-exam-data-cache') || {}
        storage[param.from_lib] = e
        uni.setStorageSync('sv-exam-data-cache', storage)
      }
      // console.log('==== 退出考试 :', e)
    },
	// ...其他方法
	calcScore(examList, scorePerQuestion = 2) {
	  // 如果不是数组，转成数组
	  if (!Array.isArray(examList)) {
	    examList = [examList]
	  }
	  let correctCount = 0
	  examList.forEach(item => {
	    if (item.correct) correctCount++
	  })
	  const totalScore = correctCount * scorePerQuestion
	  return {
	    correctCount,
	    totalScore
	  }
	},
    // exam相关事件监听
    examWatcher() {
      /**
       * 监听题目提交
       * @param e 题目记录: 可根据返回的题目记录，自定义选择存入做题记录或错题本
       */
      uni.$on('e-exam-paper-item-submit', (e) => {


        console.log('==== 监听题目提交 e-exam-paper-item-submit :', e)

      })

      /**
       * 监听考完交卷
       * @param e 答题记录列表: 可根据返回的答题记录列表，缓存或上传云端，提示下一次打开是否继续上次答题
       */
      uni.$on('e-exam-paper-complete', (e) => {
        console.log('==== 监听考完交卷 e-exam-paper-complete :', e)
		const examArr = Array.isArray(e) ? e : [e]
		const { correctCount, totalScore } = this.calcScore(examArr, 12)
		console.log(`交卷：答对了${correctCount}题，总得分${totalScore}分`)


		// 提取 selected、correct、_id
		const resultArr = examArr.map(item => ({
		selected: item.selected,
		correct: item.correct,
		id: item._id
		}))
		console.log('提取后的数组：', resultArr)

		question.runQuertionUp({data:examArr});

	})

      /**
       * 监听题目收藏
       * @param e 收藏题目数据
       */
      uni.$on('e-exam-paper-item-fav', (e) => {
        const favStorage = uni.getStorageSync('sv-exam-fav') || []
        if (e.isfav) {
          // 添加收藏
          favStorage.push(e.paper.data)
        } else {
          // 移除收藏
          favStorage.splice(
            favStorage.findIndex((item) => item.exam_id === e.paper.data.exam_id),
            1
          )
        }
        uni.setStorageSync('sv-exam-fav', favStorage)
        // 将新的收藏列表更新至myFavs
        this.myFavs = favStorage
        console.log('==== 监听题目收藏 e-exam-paper-item-fav :', e)
      })

      /**
       * 监听纠错反馈
       * @param e 纠错反馈的题目
       */
      uni.$on('e-exam-paper-item-feedback', (e) => {
        console.log('==== 监听纠错反馈 e-exam-paper-item-feedback :', e)
      })
    }
  }
}
</script>

<style lang="scss">
.sv-exam-plus-page {
  width: 100%;
  height: calc(100vh - var(--window-top));
}
</style>
